#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
//
//int main()
//{
//	int arr[10][10] = { 0 };
//	int row = 0;
//	int col = 0;
//	scanf("%d %d", &row, &col);
//	int j = 0;
//
//	int i = 0;
//	for (i = 0; i < row; i++)
//	{
//		
//		for (j = 0; j < col; j++)
//		{
//			scanf("%d", &arr[i][j]);
//		}
//	}
//	for (j = 0; j < col; j++)
//	{
//		for (i = 0; i < row; i++)
//		{
//			printf("%d ", arr[i][j]);
//		}
//		printf("\n");
//	}
//	
//
//
//	return 0;
//}



//char TriangleJudge(int arr[][10], int n)
//{
//	int j = 0;
//
//	int i = 0;
//	for (j = 0; j < n; j++)
//	{
//		
//		for (i = 0; i < n; i++)
//		{
//			if ( (i>j) && arr[i][j] != 0)
//			{
//				return "NO";
//			}
//		}
//	}
//	return "YES";
//}
//
//int main()
//{
//	int arr[10][10] = { 0 };
//	int n = 0;
//	scanf("%d",&n);
//	int i = 0;
//	for (i = 0; i < n; i++)
//	{
//		int j = 0;
//		for (j = 0; j < n; j++)
//		{
//			scanf("%d ", &arr[i][j]);
//		}
//	}
//
//	char ret[4] = TriangleJudge(arr,n);
//	printf("%s",ret);
//	return 0;
//}

//int main()
//{
//	int arr[100] = { 0 };
//
//	int i = 0;
//	int n = 0;
//	int flag1 = 1;
//	int flag2 = 1;
//	scanf("%d", &n);
//	for (i = 0; i < n; i++)
//	{
//		scanf("%d ",&arr[i]);
//		if (i > 1)
//		{
//			if (arr[i - 1] > arr[i])
//			{
//				flag1 = 0;
//			}
//			if (arr[i - 1] < arr[i])
//			{
//				flag2 = 0;
//			}
//		
//		}
//	}
//
//	if (flag1 + flag2 == 1)
//	{
//		printf("sorted\n");
//	}
//	else
//	{
//		printf("unsorted\n");
//	}
//
//
//
//	return 0;
//}
//
//int my_strlen(const char str[])
//{
//	int count = 0;
//	while (*str++)
//	{
//		count++;
//	}
//	return count;
//}
//int main()
//{
//	char str[] = "abcdefg";
//
//	int ret = my_strlen(str);
//	printf("len = %d\n", ret);
//	return 0;
//}

//#include<string.h>
//void my_strcpy(char str2[],const char str1[])
//{
//
//	while (*str2++ = *str1++)
//	{
//		;
//	}
//}
//
//int main()
//{
//	char str1[] = "abcdef";
//	char str2[10] = { 0 };
//
//	my_strcpy(str2,str1);
//
//	printf("str2:%s",str2);
//	return 0;
//}

//void my_strcat(char det[], const char src[])
//{
//	while (*det)
//	{
//		det++;
//	}
//	while (*det++ = *src++)
//	{
//		;
//	}
//	
//}
//
//
//int main()
//{
//	char str1[20] = "abcdef";
//	char str2[10] = "ghijh";
//	printf("%s\n", str1);
//
//	my_strcat(str1,str2);
//	printf("%s", str1);
//	return 0;
//}

//#include<assert.h>
//int my_strcmp(const char* str1, const char* str2)
//{
//	assert(str1 && str2);
//	int ret = 0;
//	while ( (*str1 - *str2 == 0) && *str2 )
//	{
//		str1++;
//		str2++;
//	}
//	return *str1-*str2;
//}
//int main()
//{
//	char str1[] = "abcdef";
//	char str2[] = "abcdgh";
//
//	int ret = my_strcmp(str1,str2);
//	
//	if (ret > 0)
//	{
//		printf(">");
//	}
//	else if (ret < 0)
//	{
//		printf("<");
//	}
//	else
//	{
//		printf("=");
//	}
//	return 0;
//}

//char* my_strstr(const char* des, const char* src)
//{
//	char* p1 = des;
//	char* p2 = src;
//	char* temp1 = des;
//	while (*des)
//	{
//		temp1 = des;
//		p2 = src;
//
//		while (*p2 && *temp1)
//		{
//			if (*temp1 != *p2)
//			{
//				break;
//			}
//			temp1++;
//			p2++;
//		}
//		if (*p2 == '\0')
//		{
//			return des;
//		}
//		des++;
//	}
//	return NULL;
//}
//
//int main()
//{
//	char str1[] = "abcdefg";
//	char str2[] = "cde";
//
//	char* ret = my_strstr(str1,str2);
//
//	if (ret != NULL)
//	{
//		printf("ret : %s\n", ret);
//	}
//	else
//	{
//		printf("not subs");
//	}
//	return 0;
//}

#include<string.h>



//#include<assert.h>
//int my_memcmp(void* arr2, void* arr1, int sz)
//{
//	assert(arr1 && arr2);
//	while (sz--&& *(char*)arr1 == *(char*)arr2)
//	{
//		arr1 = (char*)arr1 + 1;
//		arr2 = (char*)arr2 + 1;
//	}
//	return (*(char*)arr1 - *(char*)arr2);
//}
//int main()
//{
//	int arr1[] = { 1,2,3,4,5,6,7,8,9 };
//
//	int arr2[] = {1,2,2,6,9,7,4};
//	
//	int ret = my_memcmp(arr2, arr1, 5*sizeof(int));
//	
//	printf("ret = %d", ret);
//
//
//
//	return 0;
//}

//#include<assert.h>
//
//void* my_memcpy(void* arr1,const void* arr2,int count)
//{
//	assert(arr1&&arr2);
//	void* temp = arr1;
//	while (count)
//	{
//		*(char*)arr1 = *(char*)arr2;
//		arr1 = (char*)arr1 + 1;
//		arr2 = (char*)arr2 + 1;
//		count--;
//	}
//
//	return temp;
//}
//
//int main()
//{
//	int arr1[] = { 1,2,3,4,5,6,7,8,9 };
//
//	int arr2[] = {1,2,2,6,9,7,4};
//	int sz = sizeof(arr2);
//
//	my_memcpy(arr1+2,arr1,4*sizeof(int));
//
//	printf("\n");
//	return 0;
//}


#include<assert.h>
void* my_memmove(void* det,const void* src,int count)
{
	assert(src&&det);

	void* temp = det;
	if (src > det)
	{
		while (count)
		{
			*(char*)det = *(char*)src;
			det = (char*)det + 1;
			src = (char*)src + 1;
			count--;
		}
	}
	else
	{
		det = (char*)det + count;
		src = (char*)src + count;
		while (count)
		{
			*(char*)det = *(char*)src;
			det = (char*)det - 1;
			src = (char*)src - 1;
			count--;
		}
	}
	return temp;
}
int main()
{

	char arr[20] = "abcdefg";

	my_memmove(arr+4 , arr,4*sizeof(char));

	printf("%s", arr);
	return 0;
}